/**
 ******************************************************************************
 * @file    bsp_delay.h
 * @brief   DWT 精确延时驱动头文件
 * @version 1.1
 * @date    2023-02-18
 ******************************************************************************
 */

#pragma once
#ifndef __BSP_DELAY_H
#define __BSP_DELAY_H

#include "stm32f1xx_hal.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief  是否使用 DWT 实现延时
 * @note   若芯片不支持 DWT，可设为 0 并改用 SysTick。
 */
#define USE_DWT_DELAY                      1

/**
 * @brief  是否在每次延时函数中自动初始化 DWT
 * @note   若已在 main() 中调用 DWT_Init()，此宏应置为 0。
 */
#define CPU_TS_INIT_IN_DELAY_FUNCTION       0

/**
 * @brief 获取 CPU 主频（Hz）
 */
#define GET_CPU_ClkFreq()                   (SystemCoreClock)

/**
 * @brief  初始化 DWT 计数器
 */
void DWT_Init(void);

/**
 * @brief  获取当前 DWT 周期计数
 */
uint32_t DWT_GetCycleCount(void);

/**
 * @brief  微秒级延时
 * @param  us 微秒数
 */
void Delay_US(uint32_t us);

/**
 * @brief  毫秒级延时
 * @param  ms 毫秒数
 */
void Delay_MS(uint32_t ms);

/**
 * @brief  获取系统时间（单位：us）
 * @retval 当前时间戳（微秒）
 */
uint32_t Delay_GetTimeUS(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DELAY_H */
